const XLSX = require('xlsx')
const ejs = require('ejs')
const fs = require('fs')
const path = require('path')
const JSZip = require('jszip')
const config = require('./AnalysisConfig.json')
const typeMapping = require('./TypeMapping.json')

const files = readFileList(__dirname)
const templateDatas = []
const mainDataMap = {}


// 开始解析配置表
for (let i = 0; i < files.length; i++) {
    let file = files[i]
    if (file.indexOf(`~$`) != -1 || !file.endsWith('.xlsx')) continue // 跳过正在打开的临时文件
    console.log(file)
    const workbook = XLSX.readFile(file)
    const worksheet = workbook.Sheets[workbook.SheetNames[0]]
    const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1, defval: null }) // 将工作表转换为JSON对象
    const templateData = {
        className: file.substring(file.lastIndexOf('\\') + 1).split('-')[0],  // 类名
        columnRemark: jsonData[0].map(it => it?.toString()?.replaceAll("\r\n", "<\\r\\n>") || null), // 字段备注
        columnDesc: jsonData[1],            // 字段中文描述
        columnName: jsonData[2],            // 字段属性名
        columnOriginType: jsonData[3], // 字段原始字符串类型
        columnType: jsonData[3].map(type => typeMapping[config.language][type]), // 字段类型
        globalData: jsonData[4],            // -1 项数据
    }
    const mainData = [templateData.columnName, templateData.columnOriginType, ...(jsonData.length > 4 && jsonData.slice(4) || []).filter(arr => !!arr.length && arr.some(i => !!i))]

    // push
    templateDatas.push(templateData)
    mainDataMap[templateData.className] = mainData

    console.log(`Analysis success, row: ${jsonData.length}\t[${file}]`)
}

// 渲染模版
const templatePath = path.join(__dirname, `template_${config.language}.ejs`);
const outputPath = path.join(config.server.classOutPath, 'Cfg.java');

ejs.renderFile(templatePath, { td: templateDatas }, (err, result) => {
    if (err) {
        console.error('Error rendering template:', err);
        return;
    }
    // 渲染成功，生成文件
    !fs.existsSync(config.server.classOutPath) && fs.mkdirSync(config.server.classOutPath)
    fs.writeFileSync(outputPath, result, 'utf8');
    console.log('>>> ', outputPath)
})

// ZIP 压缩配置表数据
const zip = new JSZip()
for (const key in mainDataMap) {
    zip.file(`${key}.json`, JSON.stringify(mainDataMap[key]))
}
// 生成 data.json 文件
!fs.existsSync(config.server.dataJsonOutPath) && fs.mkdirSync(config.server.dataJsonOutPath)
fs.writeFileSync(path.join(config.server.dataJsonOutPath, 'dataJson.json'), JSON.stringify(mainDataMap))
// 生成 ZIP 文件
zip.generateAsync({ type: 'nodebuffer', compression: 'DEFLATE', compressionOptions: { level: 9 /* 最小大小压缩 */ } })
    .then((content) => {
        // 将 ZIP 文件写入磁盘
        !fs.existsSync(config.server.dataBinOutPath) && fs.mkdirSync(config.server.dataBinOutPath)
        fs.writeFileSync(path.join(config.server.dataBinOutPath, 'data.bin'), content)
        console.log(`[ZIP] Json data zip success: data.bin`)
    })
    .catch((err) => {
        console.error('压缩 JSON 时出错:', err);
    });




// ========== helper ==========
function readFileList(dir, filesList = []) {
    const files = fs.readdirSync(dir);
    files.forEach((item, index) => {
        if (item.indexOf('node_modules') != -1) return
        var fullPath = path.join(dir, item);
        const stat = fs.statSync(fullPath);
        if (stat.isDirectory()) {
            readFileList(path.join(dir, item), filesList);  //递归读取文件
        } else {
            filesList.push(fullPath);
        }
    });
    return filesList;
}